package com.ktgj.customer.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;


/**  
 * 系统工具，有UUID，MD5等
 * @Description: 系统工具，有UUID，MD5等 
 * Revision History:
 * <who>       <when>        <what>
 * hey 2014年5月16日 create 
 */ 
public class SysUtils {
	
	public static final String ENCODING_GBK="GBK";
	public static final String ENCODING_UTF_8="UTF-8";

	public final static ArrayList<String>  ProdctArray  = new ArrayList<String>();
	  
	static {  
		ProdctArray.add("13101160399");  
		ProdctArray.add("13101160398"); 
		ProdctArray.add("13101100399"); 
		ProdctArray.add("13101100398"); 
	}

	public static ArrayList<String> getProdctarray() {
		return ProdctArray;
	}

	/**
	 * 取得唯一不重复的数
	 * @Description: 取得唯一不重复的数
	 * @return String
	 */
	public static String getUuid() {
		return java.util.UUID.randomUUID().toString();
	}

	/**  
	 * MD5加密 ,UTF-8编码
	 * @Description: MD5加密 ,UTF-8编码
	 * @param originstr
	 * @return String 
	 */
	public static String ecodeByMD5(String originstr) {
		return ecodeByMD5(originstr, ENCODING_UTF_8);
	}
	
	/**
	 * 按指定编码MD5加密 
	 * @Description: 按指定编码MD5加密 
	 * @param originstr 
	 * @param encoding
	 * @return String 
	 */
	public static String ecodeByMD5(String originstr,String encoding) {
		
		String result = null;
		
		// 用来将字节转换成 16 进制表示的字符
		char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
				'a', 'b', 'c', 'd', 'e', 'f' };
		
		if (originstr != null) {
			
			try {
				
				// 返回实现指定摘要算法的 MessageDigest 对象
				MessageDigest md = MessageDigest.getInstance("MD5");
				
				// 使用utf-8编码将originstr字符串编码并保存到source字节数组
				if(encoding==null || encoding.trim().length()==0){
					encoding=ENCODING_UTF_8;
				}
				byte[] source = originstr.getBytes(encoding);
				
				// 使用指定的 byte 数组更新摘要
				md.update(source);
				
				// 通过执行诸如填充之类的最终操作完成哈希计算，结果是一个128位的长整数
				byte[] tmp = md.digest();
				
				// 用16进制数表示需要32位
				char[] str = new char[32];
				
				for (int i = 0, j = 0; i < 16; i++) {
					
					// j表示转换结果中对应的字符位置
					// 从第一个字节开始，对 MD5 的每一个字节
					// 转换成 16 进制字符
					
					byte b = tmp[i];
					
					// 取字节中高 4 位的数字转换
					// 无符号右移运算符>>> ，它总是在左边补0
					// 0x代表它后面的是十六进制的数字. f转换成十进制就是15
					str[j++] = hexDigits[b >>> 4 & 0xf];
					
					// 取字节中低 4 位的数字转换
					str[j++] = hexDigits[b & 0xf];
					
				}
				
				result = new String(str);// 结果转换成字符串用于返回
				
			} catch (NoSuchAlgorithmException e) {
				
				// 当请求特定的加密算法而它在该环境中不可用时抛出此异常
				e.printStackTrace();
				
			} catch (UnsupportedEncodingException e) {
				
				// 不支持字符编码异常
				e.printStackTrace();
			}
			
		}
		
		return result;
	}
	
	
	/**
	 * @author 刘贞波 
	 * @2014-07-09
	 * @Description: 判断传入的值是否存在，存在则加1，不存在则追加进去，指定值为1 
	 * @param @param map
	 * @param @param str
	 * @param @return 
	 * @return Map<String,Integer> 
	 * @throws
	 */
	public static Map<String,Integer> findAndAddValue(Map<String,Integer> map,String str){
		Set<String> set = map.keySet();
		List<String> list = new ArrayList<String>();
		list.addAll(set);
		if(list.indexOf(str)!=-1){
			Integer num = map.get(str.trim());
			map.put(str.trim(), ++num);
		}else{
			map.put(str, 1);
		}
		return map;
	}

	
	
}
